package BakaNoPackage;

import BakaNoPackage.Donnees.*;
import BakaNoPackage.Exception.*;
import java.io.*;

public class Console {

	private BufferedReader entree;
	
	//exécuteur vers qui rediriger les commandes
	private Executeur executeur;
	
	
	/**
	 * Créé la console, gère les IO et exécute les commandes
	 * @param executeur
	 */
	public Console(Executeur executeur){
		this.executeur = executeur;
		
		System.out.println(presenterApplication());
		
		String commande;
		
		//lecture des commandes
		while(true){
			
			//affichage du prompt
			System.out.print(executeur.getPrompt());
			
			//System.console().format("test", "ceci est un test");
			//System.console().
			
			//récupère l'entrée
			entree = new BufferedReader(new InputStreamReader(System.in));
			
			try{
				//on récupère la commande
				commande = entree.readLine();
				
				//si c'est exit, on quitte le logiciel, sinon on execute la commande
				if(commande.toLowerCase().equals("exit"))
					return;
				
				//on execute la commande
				System.out.println(executer(commande));
				
			}catch(IOException e){
				System.out.println("Erreur de saisie : " + e.getMessage());
			}
		}
	}
	
	public String executer(String requete){
		
		//Gère le besoin de confirmation
		ConfirmationStatus confirmation = new ConfirmationStatus();
		
		String retour;
		
		//Si il y a besoin d'une confirmation
		try{
			
			confirmation.confirmation = false;
			
			retour = this.executeur.execute(new Interpreteur(requete), confirmation);
			
			//si il y a besoin d'une confirmation
			if(confirmation.confirmation){
				
				//demande de confirmation
				System.out.print(confirmation.texteConfirmation + " (o/n) : ");
				
				
				//on attend une confirmation
				String reponse;
				while(true){
					reponse = entree.readLine();
					
					//on execute a nouveau
					if(reponse.toLowerCase().equals("o")){
						
						//requete confirmée
						confirmation.confirmation = true;
						
						//execute a nouveau la requête confirmée
						return this.executeur.execute(new Interpreteur(requete), confirmation);
						
						
					}else if(reponse.toLowerCase().equals("n")){
						return "";
					}else{
						//caractère non attendu
						System.out.println("Veuillez entrer o/n.");
					}
					
				}
			}
		}catch(Exception e){
			return e.getMessage();
		}
		
		return retour;
	}
	
	/**
	 * Présente l'application
	 * @return
	 */
	public String presenterApplication(){
		String reponse = "";
		
		reponse += "**********************************************\n";
		reponse += "*              ANIME NO BAKA                 *\n";
		reponse += "*     La gestion d'anime pour les otakus     *\n";
		reponse += "*                                            *\n";
		reponse += "* Auteurs : Jonas Renaudot                   *\n";
		reponse += "*           Raphael Tripet                   *\n";
		reponse += "*           Nicolas Muller                   *\n";
		reponse += "*                                            *\n";
		reponse += "* Date de réalisation : 18.12.2008           *\n";
		reponse += "*                                            *\n";
		reponse += "* Gestion d'une bibliotheque d'anime via une *\n";
		reponse += "* base de donnees.                           *\n";
		reponse += "**********************************************\n";
		
		return reponse;
	}
	
	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args){
		Console console;
		Donnees donnees;
		Executeur executeur;
		Droits droits;
		AnimeNoBaka animeNoBaka;
		
		try{
			donnees = new Donnees("anime");
			droits = new Droits(true, true);
			animeNoBaka = new AnimeNoBaka(donnees);
			executeur = new Executeur(animeNoBaka, droits);
			console = new Console(executeur);
		}catch(Exception e){
			System.out.println(e + " - " + e.getMessage());
		}
		
		
	}
}
